/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package util.usuario.seguridad;

import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author Rdelacruz
 */
public class Insercion {    
    //protected AlcanceOperacion tipo;
    
    protected boolean permitida;
    
    protected final Map<String,Boolean> columnasExceptuadas;    
    protected final Map<String,String[]> columnasRestringidas;//restringidas a ciertos valores
    protected Condicion condicionExterna;  
    
    public Insercion() {
        columnasExceptuadas = new HashMap<String, Boolean>();
        columnasRestringidas = new HashMap<String, String[]>();
    }
    
    public Insercion excepto(String[] columnasExceptuadas) {
        //tipo = AlcanceOperacion.ALGUNOS_REGISTROS;
        for(String col : columnasExceptuadas) {
            this.columnasExceptuadas.put(col.toUpperCase(), true);
        }
        return this;  
    }

    public Insercion restringir(String columna, String[] valoresPermitidos) {
        columnasRestringidas.put(columna.toUpperCase(), valoresPermitidos);
        return this;
    }
    
    public Insercion restringir(String columna, String valorPermitido) throws Exception {
        if(valorPermitido==null)
            throw new Exception("La columna '"+columna+"' no puede tener un valor permitido nulo");
        return restringir(columna, new String[]{valorPermitido});
    }
    
    public String[] getValoresPermitidosParaColumna(String columna) {
        return columnasRestringidas.get(columna.toUpperCase());
    }
       
    public boolean puedeModificarColumna(String columna) {
        //return permitida && 
        //        (columnasExceptuadas.get(columna.toUpperCase())==null || columnaTieneValoresPermitidos(columna));
        return permitida && columnasExceptuadas.get(columna.toUpperCase())==null;
    }
        
    public boolean puedeModificarValor(String columna, Object valor) {
        return puedeModificarColumna(columna) && columnaPuedeModificarValor(columna,valor);
    }
    
    private String objectToValor(Object valor) {
        if(valor instanceof String)
            return (String)valor;
        throw new UnsupportedOperationException("No soportado aún");
    }
    
    private boolean columnaPuedeModificarValor(String columna, Object valor) {
        String[] valores = getValoresPermitidosParaColumna(columna);        
        if(valores==null)
            return true;        
        
        String valorString = objectToValor(valor);
        for(String v : valores) {
            if(v.equals(valorString))
                return true;
        }
        return false;
    }
    
    /*
    private boolean columnaTieneValoresPermitidos(String columna) {
        String[] columnas = getValoresPermitidosParaColumna(columna);
        //return columnas==null || (columnas!=null && columnas.length>0);
        return columnas==null || columnas.length>0;
    }*/
    
    public boolean puedeModificarRegistro(Object registro) {
        return permitida && ( condicionExterna==null || (condicionExterna !=null && condicionExterna.validar(registro)) );
    }
    
    public boolean puedeModificarTodosLosRegistros() {
        return permitida && columnasExceptuadas.isEmpty();
    }


    
}
